#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>

#define MSG_KEY 1234
#define MSG_SIZE 256



int main() {
    int msgid;
    struct msgbuf msg;

    // 创建消息队列
    msgid = msgget(MSG_KEY, 0666 | IPC_CREAT);
    if (msgid == -1) {
        perror("msgget (server)");
        exit(EXIT_FAILURE);
    }
    printf("Server: Message queue created with ID %d\n", msgid);

    // 循环接收客户端消息并发送回执
    while (1) {
        // 接收类型为1的消息
        if (msgrcv(msgid, &msg, MSG_SIZE, 1, 0) == -1) { // 使用 MSG_SIZE 作为 msgsz 参数
            perror("msgrcv (server)");
            exit(EXIT_FAILURE);
        }
        printf("Server: Received message: %s\n", msg.mtext);

        // 发送回执
        pid_t client_pid = msg.mtype; // 客户端的PID
        snprintf(msg.mtext, MSG_SIZE, "receipt of %s from <您的姓名xxx>'s server to Process %d", msg.mtext, client_pid);
        msg.mtype = client_pid; // 设置回执类型为客户端的PID
        if (msgsnd(msgid, &msg, strlen(msg.mtext) + 1, 0) == -1) {
            perror("msgsnd (server)");
            exit(EXIT_FAILURE);
        }
        printf("Server: Sent receipt to Process %d\n", client_pid);
    }

    // 清理消息队列（理论上不会执行到这里）
    msgctl(msgid, IPC_RMID, NULL);
    return 0;
}